home *** CD-ROM | disk | FTP | other *** search
- #include <sys/types.h>
- #include <sys/syslimits.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include "crtlocal.h"
-
- int open(const char *name, int flags, ...)
- {
- OSErr err;
- int fd,refnum;
- HParamBlockRec pb;
- FSSpec name1 = hfs_canon(crt_parID, name, 1);
- if (!*name1.name) return -1;
- pb.ioParam.ioNamePtr = name1.name;
- if (flags & O_CREAT)
- {
- unlink(name);
- #if 0
- pb.ioParam.ioVRefNum = name1.vRefNum;
- pb.fileParam.ioDirID = name1.parID;
- err = PBHCreateSync(&pb);
- if (!err) chown(name, 'R*', 'ch');
- #else
- err = FSpCreate(&name1,'R*','ch',0);
- #endif
- }
- else
- {
- struct stat statbuf;
- err = errtran(macstat(name1.name, &statbuf, name1.vRefNum, name1.parID));
- if (err) return -1;
- if (S_ISDIR(statbuf.st_mode))
- {
- fd = next_fd(3);
- crt_fd_tab[fd].fd = statbuf.st_ino;
- crt_fd_tab[fd].flags = O_CATALOG;
- return fd;
- }
- if (S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode))
- {
- fd = next_fd(1);
- crt_fd_tab[fd].fd = statbuf.st_rdev;
- crt_fd_tab[fd].flags = flags|O_PIPE;
- return fd;
- }
- }
- pb.ioParam.ioVRefNum = name1.vRefNum;
- pb.fileParam.ioDirID = name1.parID;
- pb.ioParam.ioPermssn = flags&(O_WRONLY|O_RDWR)?fsRdWrShPerm:fsRdPerm;
- err = errtran(PBHOpenSync(&pb));
- if ( err ) return -1;
- refnum = pb.ioParam.ioRefNum;
- if (flags & O_APPEND)
- {
- pb.ioParam.ioRefNum = refnum;
- pb.ioParam.ioPosMode = fsFromLEOF;
- pb.ioParam.ioPosOffset = 0;
- (void)PBSetFPosSync((ParmBlkPtr)&pb);
- }
- if (flags & O_TRUNC)
- {
- pb.ioParam.ioCompletion = 0;
- pb.ioParam.ioRefNum = refnum;
- pb.ioParam.ioMisc = 0;
- PBSetEOFSync((ParmBlkPtr)&pb);
- }
- fd = next_fd(3);
- crt_fd_tab[fd].fd = refnum;
- crt_fd_tab[fd].flags = flags;
- return fd;
- }
-
- int creat(const char *name, mode_t mode)
- {
- return open(name, O_CREAT|O_TRUNC|O_WRONLY, mode);
- }
-